home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / INS.SA < prev    next >
Text File  |  1987-03-04  |  13KB  |  560 lines

  1.   NAM  INS
  2.   TTL  DECIMAL INPUT ROUTINE
  3. *
  4. *    DEFINE  EXTERNAL REFERENCES
  5. *
  6.   XDEF    DECBIN
  7. *
  8.   XREF    PWRTEN,ROUND,CHKUNF,CHKOVF,RTNAN,OVFLNT,UNFLNT
  9.   XREF    LNORM,FMUL,FDIV,FPMOVE,CLRES,IOPSUB,IOPSET
  10.   XREF    RTZERO,DENORM
  11. *
  12. *
  13. *    REVISION HISTORY:
  14. *      DATE      PROGRAMMER         REASON
  15. *
  16. *    23.MAY.80      G.WALKER &         ORIGINAL
  17. *    17.JUN.80      G. STEVENS         FIX DECBIN
  18. *    05.AUG.80      G. STEVENS         FIX DECBIN( S FOR U TYPO )
  19. *    28.AUG.80      J. BONEY         CLEAR INEXACT BEFORE LAST ROUND
  20. *    28.AUG.80      G. STEVENS         CHECK FOR ZERO FRACTION STRING
  21. *    24.OCT.80      G. STEVENS         FIX UP BCD MINUS SIGN PROBLEM
  22. *    15.DEC.80      G. STEVENS         SET STIKY PROPERLY FOR FINAL ROUND
  23. *
  24. *
  25.   PAG
  26. *
  27. * LOCAL EQUATES
  28. *
  29. DMINUS EQU  $0F     BCD STRING MINUS SIGN
  30. DPLUS EQU  00        BCD STRING PLUS SIGN
  31. *
  32. ************************************************************
  33. *
  34. * PROCEDURE  STRBIN
  35. *
  36. *    STRBIN CONVERTS A SIGNED UNPACKED BCD STRING
  37. * REPRESENTING A FLOATING PT. SIGNIFICAND AND CONVERTS
  38. * IT TO A BINARY FLOATING PT. NO. IN INTERNAL FORMAT.
  39. *
  40. * ON ENTRY: X - POINTS TO THE INTERNAL STACK LOCATION
  41. *        OF THE RESULTING FLOATING VALUE.
  42. *
  43. *        Y - POINTS TO THE START OF THE BCD STRING
  44. *
  45. *
  46. *
  47. * REGISTERS EQUATES
  48. *
  49. ALL  REG  CC,A,B,X,Y,U
  50. *
  51. STRBIN EQU *
  52. *
  53. * CONVERT FRACTION STRING TO A BINARY INTEGER
  54. *
  55.  LEAX  FRACT,X
  56. *
  57.  LBSR  STRINT
  58. *
  59.  LEAX -FRACT,X
  60. *
  61. * SET THE SIGN OF THE RESULT TO THE SIGN OF THE
  62. * BCD STRING.
  63. *
  64. *
  65.  LDA  -1,Y           SIGN OF THE BCD STRING
  66.  IF  A,EQ,#DMINUS       SIGN NEGATIVE
  67.    LDA    #$80
  68.    STA    SIGN,X
  69. *
  70.  ENDIF
  71. *
  72. * SET EXPONENT TO FRACTSIZE-1
  73. *
  74.  LDD  #FRACSZ-9
  75.  STD  EXP,X
  76. *
  77. * NORMALIZE SIGNIFICAND
  78. *
  79.  LBSR LNORM
  80. *
  81. *
  82.  RTS               RETURN
  83. *
  84. *
  85.  PAG
  86. ************************************************************
  87. *
  88. * PROCEDURE  DECBIN
  89. *
  90. *    DECBIN CONVERTS A FLOATING PT. NO. THAT IS
  91. * REPRESENTED BY AN UNPACKED BCD STRING INTO ITS
  92. * INTERNAL BINARY REPRESENTATION. THE BCD STRING
  93. * HAS THE FOLLOWING FORM:
  94. *
  95. * +-------------------+---+-----------------+---+
  96. * | 19 DIGIT FRACT.   |SF | 4 DIGIT EXP.    |SE |
  97. * +-------------------+---+-----------------+---+
  98. *
  99. *  SF = SIGN FRACTION ; 0 = PLUS, -1 = MINUS
  100. *  SE = SIGN EXPONENT ;   SAME
  101. *
  102. * LOCAL STORAGE ON THE STACK
  103. *
  104. BDEXP EQU  0              BINARY DECIMAL EXPONENT
  105. TCTL EQU  BDEXP+2          TEMP LOC. OF CTL. BYTE
  106. TRND EQU  TCTL+1          TEMP LOC. OF ROUNDING PREC.
  107. *
  108. *
  109. DECBIN EQU  *
  110. *
  111. * CHECK FOR A ZERO FRACTION IF SO RETURN A TRUE ZERO
  112. *
  113.  LDY  FRACT2,U
  114.  LEAY  DECSIG,Y         POINT AT THE DECIMAL EXPONENT
  115.  CLRA
  116.  LDB  A,Y            GET FIRST DIGIT
  117.  ANDB  #$0F            MASK OFF UPPER NIBBLE
  118.  WHILE    B,EQ,#0
  119.    INCA
  120.    LDB    A,Y
  121.    ANDB  #$0F
  122.    IF A,GE,#SIGDIG
  123.      LDB  #$FF
  124. *
  125.    ENDIF
  126. *
  127.  ENDWH
  128.  IF  A,GE,#SIGDIG        FRACTIONS ALL ZEROS
  129.    LBSR  RTZERO         RETURN A TRUE ZERO
  130. *
  131.    LBRA  EXITIN         EXIT ROUTINE
  132. *
  133.  ENDIF
  134. *
  135.  LEAS  -(TRND+1),S        CREATE SPACE FOR LOCALS
  136. *
  137. * CONVERT BCD EXPONENT STRING TO A BINARY INTEGER
  138. * RESULT TO RESIDE IN EXP2
  139. *
  140.  LDY  FRACT2,U
  141.  LEAY  DECEXP,Y         POINT Y AT THE BCD EXPONENT
  142.  LEAX  BDEXP,S            POINT TO THE LOC. OF THE BCD EXP.
  143.  LDB  #EXPDIG            NO. OF BCD DIGITS IN EXP
  144.  LDA  #EXPLEN            NO. OF BYTES IN BIN. DEC. EXP.
  145. *
  146.  LBSR  STRINT            BCD STRING TO BIN. INTEGER
  147. *
  148. * CHECK THE SIGN OF THE EXPONENT; IF NEGATIVE
  149. * COMPLEMENT THE RESULT OF STRINT
  150. *
  151.  LDY  FRACT2,U
  152.  LDA  SE,Y
  153.  IF  A,EQ,#DMINUS        EXPONENT NEGATIVE
  154.    COM    BDEXP,S
  155.    NEG    BDEXP+1,S
  156.    IFCC  CC
  157.      INC  BDEXP,S
  158. *
  159.    ENDIF
  160. *
  161.  ENDIF
  162. *
  163. * CONVERT BCD FRACTION TO AN INTEGER VALUED FLOATING VALUE
  164. *
  165.  LEAY  DECSIG,Y         POINT TO  SIGN OF BCD FRACTION
  166.  LEAX  RESULT,U         POINT TO THE LOC. OF F.P. RESULT
  167.  LDB  #SIGDIG            NO. OF BCD DIGITS IN FRACTION
  168.  LDA  #SIGLEN-1         NO. OF BYTES IN THE FRACTION
  169. *
  170.  BSR  STRBIN            BCD STRING TO FLOATING INTEGER
  171. *
  172. * NOW MASSAGE THE FLOATING INTEGER SO THAT THE INFLUENCE
  173. * OF THE BASE 10 EXPONENT( BDEXP ) IS TAKEN INTO ACCOUNT
  174. * THIS IS DONE BY REPEATED MULTIPLICATIONS OR DIVISIONS
  175. * BY 10 USING THE BASE 10 EXPONENT AS A COUNTER FOR THIS
  176. * PROCCESS. THE BASE 10 EXPONENT MUST FIRST BE ADJUSTED
  177. * BY A FACTOR OF P TO TAKE INTO ACCOUNT THE LOCATION OF
  178. * DECIMAL IN THE ORIGINAL BCD FRACTION STRING. SINCE P
  179. * IS JUST THE LOCATION OF THE PT. FROM THE LEAST SIG.
  180. * END OF THE STRING, THEN ALL ONE DOES IS SUBTRACT P
  181. * FROM THE BASE 10 EXPONENT.
  182. *
  183. * ADJUSTS EXPONENT; SUBTRACT P FROM BDEXP
  184. *
  185.  CLR  TPARAM,U
  186.  LDD  TPARAM,U              VALIDATE P
  187.  IFCC  LT              P NEGATIVE
  188.    BRA    INVLD              GO TO INVALID
  189. *
  190.  ENDIF
  191.  IF  D,GT,#MAXP           IF P TOO BIG
  192. *
  193. INVLD EQU  *
  194. *
  195.     LDA #7              SIGNAL INVALID OPERATION = 7
  196.     LBSR IOPSET
  197.     LDD #MAXP              DEFAULT TO P = MAX
  198.     STD TPARAM,U
  199. *
  200.  ENDIF
  201.  LDD  BDEXP,S              GET DECIMAL EXPONENT
  202.  SUBD  TPARAM,U           SUBTRACT P
  203.  STD  BDEXP,S              RESTORE DECIMAL EXPONENT
  204. *
  205. * PERFORM THE OPERATIONS IN EXTENDED PRECISION
  206. * WITH ROUND TO NERAEST IN EFFECT.
  207. *
  208.  LDA  [PFPCB,U]           GET CONTROL BYTE
  209.  STA  TCTL,S              SAVE IT
  210.  ANDA  #$FF-(CTLRND+CTLSIZ)
  211.  ORA  #PREXT+RN
  212.  STA  [PFPCB,U]           RESET CONTROL BYTE
  213. *
  214.  LDA  RPREC,U              GET CURRENT ROUNDING PRECISION
  215.  STA  TRND,S              SAVE IT
  216.  LDA  #EXT              REPLACE WITH EXTENDED
  217.  STA  RPREC,U
  218. *
  219. * SAVE THE FLOATING INTEGER,I , ON THE S STACK
  220. *
  221.  LEAS  -ARGSIZ,S          CREAT SPACE
  222.  LEAX  RESULT,U           SOURCE
  223.  LEAY  0,S              DESTINATION
  224.  LBSR FPMOVE              MOVE I TO TEMP
  225. *
  226. * CALCULATE 10^[(W-P)] AND PLACE IT IN ARG2
  227. *
  228.  LDD  BDEXP+ARGSIZ,S          GET BASE TEN EXPONENT
  229.  IFCC  LT              BASE TEN EXPONENT NEGATIVE
  230.    COMA
  231.    COMB
  232.    ADDD  #01
  233. *
  234.  ENDIF
  235. *
  236.  LBSR  PWRTEN
  237. *
  238.  LEAY  ARG2,U              DESTINATION
  239.  LBSR  FPMOVE              MOVE  10^[(W-P)]
  240. *
  241. * MOVE I BACK TO ARG1 AND DEOENDING ON THE SIGN OF THE
  242. * BASE TEN EXPONENT EITHER MULTIPLY IT BY 10^(W-P)
  243. * ( EXP. POSITIVE ) OR DIVIDE BY 10~(W-P) (EXP. NEGATIVE )
  244. *
  245.  LEAX  0,S              SOURCE
  246.  LEAY  ARG1,U              DESTINATION
  247.  LBSR  FPMOVE              MOVE I TO ARG1
  248. *
  249.  LEAS  ARGSIZ,S           REMOVE TEMP I FROM STACK
  250. *
  251. * ZERO OUT THE STACK FRAME RESULT
  252. *
  253.  LEAX  RESULT,U
  254.  LDB  #CLRALL              CLEAR ALL OF THE ARGUMENT
  255.  LBSR  CLRES
  256. *
  257.  LDD  BDEXP,S              CHECK SIGN BASE TEN EXP.
  258.  IFCC  GE              BASE TEN EXPONENT POSITIVE
  259.    LBSR  FMUL              MULTIPLY I * 10^(W-P)
  260. *
  261.  ELSE                  BASE TEN EXPONENT NEGATIVE
  262.    LBSR  FDIV              DIVIDE I / 10~(W-P)
  263. *
  264.  ENDIF
  265. *
  266. *
  267. * RESTORE ORIGINAL CONTROL BYTE
  268. *
  269.  LDD  TCTL,S              ORIGINAL CTL. BYTE AND PREC.
  270.  STA  [PFPCB,U]           RESTORE CONTROL BYTE
  271.  STB  RPREC,U              RESTORE ROUNDING PRECISION
  272. *
  273. * CLEAR THE INEXACT BIT FROM ANY PREVIOUS OPERATIONS
  274. * THE FINAL ROUND OR THE CHECK FOR VALID RESULT
  275. * WILL HAVE FINAL SAY ON INEXACT.
  276. *
  277.  LDA TPARAM,U
  278.  ANDA #$FF-ERRINX      CLEAR INEXACT BIT
  279.  STA TPARAM,U
  280. *
  281. * SET UP THE FINAL ROUND
  282. *
  283.  LEAX  RESULT,U       POINTER TO THE ARGUMENT
  284.  CLR  STIKY,U          CLEAR STICKY FROM PREVIOUS ROUND
  285.  CLRB              NO SHIFTING IN DENORM
  286. *
  287.  LBSR  DENORM          SET STIKY
  288. *
  289. * NOW ROUND THE RESULT TO THE DESIRED PRECISION AS
  290. * PER CALLERS ROUNDING MODE AND PRECISION
  291. *
  292.  LBSR  ROUND
  293. *
  294. *
  295. * CHECK FOR OVERFLOW AND UNDERFLOW AND TAKE APPROPRIATE
  296. * ACTION DEPENDING WHETHER TRAPS ARE ENABLED OR NOT.
  297. *
  298.  LBSR  CHKUNF              CHECK FOR UNDERFLOW
  299.  IFCC  EQ
  300. *
  301. * IF TRAPS ENABLED THEN RETURN A "NAN" ELSE INVOKE
  302. * UNFL_NO_TRAP
  303. *
  304.    LDY    PFPCB,U           POINT AT CONTROL BLOCK
  305.    LDA    ENB,Y
  306.    ANDA  #ENBUNF          UNDEFLOW TRAP ENABLE FLAG
  307.    IFCC  NE              TRAP ENABLED
  308.      LBSR  RTNAN          RETURN A "NAN"
  309. *
  310.    ELSE               TRAP DISABLED
  311.      LBSR  UNFLNT          NO TRAP HANDLER
  312. *
  313.    ENDIF              TRAPS ENABLED
  314. *
  315.  ENDIF                  UNDERFLOW CHECK
  316. *
  317. * CKECK FOR OVERFLOW
  318. *
  319.  LBSR  CHKOVF
  320.  IFCC  EQ
  321. *
  322. * IF TRAPS ENABLED THEN RETURN A "NAN" ELSE INVOKE
  323. * OVFL_NO_TRAP
  324. *
  325.    LDY    PFPCB,U           LOOK AT CONTROL BLOCK
  326.    LDA    ENB,U
  327.    ANDA  #ENBOVF          OVERFLOW TRAP ENABLE FLAG
  328.    IFCC  NE               TRAP ENABLED
  329.      LBSR  RTNAN          RETURN A "NAN"
  330. *
  331.    ELSE               TRAP DISABLED
  332.      LBSR  OVFLNT          NO TRAP HANDLER
  333. *
  334.    ENDIF              TRAP ENABLED
  335. *
  336.  ENDIF                  OVERFLOW CHECK
  337. *
  338. EXTINS EQU  *            EXIT POINT FOR INS
  339. *
  340.  LEAS  (TRND+1),S        CLEAN UP LOCCALS FROM STACK
  341. *
  342. *
  343. EXITIN EQU  *             DECBIN EXIT POINT
  344. *
  345. *
  346.  RTS                  RETURN
  347. *
  348. *    LOCAL EQUATES
  349. *
  350. EXPLEN EQU 2
  351. SIGLEN EQU  9
  352. ACCLEN EQU SIGLEN-1
  353. *
  354. *
  355. *
  356. MUL10  MACR
  357. ****************************************************
  358. *
  359. *   MUL10
  360. *
  361. *     MUL10 TAKES A MULTI- PRECISION BINARY INTEGER
  362. * AND MULTIPLIES IT BY 10. THIS OPERATION IS USEFULL
  363. * FOR PERFORMING DECIMAL TO BINARY CONVERSIONS. UPON
  364. * INVOCATION REG. X MUST POINT TO THE MSBYTE OF THE
  365. * MULTI-BYTE ARGUMENT.
  366. *
  367. * ON ENTRY: X - POINTS TO THE MSBYTE OF THE INPUT
  368. *        OPERAND.
  369. *
  370. * ON EXIT: THE INPUT ARGUMENT IS MULTIPLIED BY 10
  371. *
  372. *       X IS UNCHANGED; A & B DESTROYED
  373. *
  374. *   TO INVOKE MUL10:
  375. *
  376. *        MUL10      X,< BYTE LENGTH OF OPERAND >
  377. *
  378. * CHECK FOR PROPER NO. OF ARGUMENTS
  379. *
  380.  IFNE  NARG-2
  381.    FAIL  ** TOO MANY OR TOO FEW INPUT ARGUMENTS **
  382.    EXIT
  383.  ENDC
  384. *
  385. * CREATE A TEMPORARY A TEMPORARY ACCUMULATOR ON THE STACK
  386. *
  387.  LEAS  -\1,S
  388. *
  389. * MULTIPLY INPUT BY 2 I.E. LEFT SHIFT ONCE
  390. *
  391.  ANDCC    #NC               CLEAR CARRY
  392.  LSHIFT  0,X,(\1)           LEFT SHIFT
  393. *
  394. * COPY ARG*2 TO A TEMPORARY ACCUMULATOR
  395. *
  396.  LDB  #(\1)               ARGUMENT SIZE
  397.  WHILE    B,GT,#0
  398.    DECB
  399.    LDA    B,X               SOURCE
  400.    STA    B,S               DESTINATION
  401. *
  402.  ENDWH
  403. *
  404. * LEFT SHIFT ARGUMENT TWICE MORE TO YIELD 8*
  405. * INPUT ARGUMENT.
  406. *
  407.  LDB  #2
  408.  WHILE    B,GT,#0
  409.    ANDCC  #NC               CLEAR CARRY
  410.    LSHIFT  0,X,(\1)           LEFT SHIFT
  411.    DECB                DECREMENT COUNTER
  412. *
  413.  ENDWH
  414. *
  415. * NOW ADD 8*INPUT TO 2*INPUT TO YIELD 10*INPUT
  416. *
  417.  LDB  #(\1)               ARGUMENT LENGTH
  418.  DECB                   CONVERT LENGTH TO OFFSET
  419. *
  420.  CLRA
  421.  WHILE    B,GE,#0
  422.    RORA                RESTORE CARRY
  423.    LDA    B,X               GET ARG1
  424.    ADCA  B,S               ADD IN ARG2
  425.    STA    B,X               SAVE RESULT
  426.    ROLA                SAVE CARRY IN A
  427.    DECB                DECREMENT INDEX
  428. *
  429.  ENDWH
  430. *
  431.  LEAS  \1,S               CLEAN UP STACK
  432. *
  433. *
  434.  ENDM
  435. *
  436. *
  437.  PAGE
  438. *********************************************************
  439. *
  440. * PROCEDURE  STRINT
  441. *
  442. *     STRINT CONVERTS AN UNSIGNED DECIMAL VALUE( RE-
  443. * PRESENTED BY AN ARRAY OF UNPACKED BCD DIGITS) TO
  444. * AN UNSIGNED BINARY INTEGER .
  445. *
  446. * ON ENTRY: Y - POINTS TO THE START OF THE BCD ARRAY
  447. *
  448. *        X - POINTS TO THE START OF THE ACCUMULATOR
  449. *        FOR THE BINARY RESULT.
  450. *
  451. *        A - CONTAINS THE LENGTH OF THE BINARY RESULT
  452. *        ( IN BYTES )
  453. *
  454. *        B - CONTAINS THE NUMBER OF BYTES IN THE BCD ARRAY
  455. *
  456. * ON EXIT: THE BINARY ACCUMULATOR POINTED TO BY X CONTAINS
  457. *       THE BINARY INTEGER EQUIVALENT TO THE BCD STRING.
  458. *
  459. *       X, Y, A, B - UNCHANGED
  460. *
  461. * LOCAL STORAGE ON THE STACK
  462. *
  463. *          0,S - BYTE LENGTH OF THE BINARY RESULT
  464. *          1,S - BYTE LENGTH OF THE BCD ARRAY
  465. *          2,S - POINTER TO THE BINARY RESULT
  466. *          4,S - POINTER TO THE BCD ARRAY
  467. *
  468. *
  469. *
  470. *
  471. STRINT EQU  *
  472. *
  473.  PSHS  X,Y,A,B                 SAVE CALLERS REGISTERS
  474. *
  475. * ZERO OUT THE BINARY ACCUMULATOR
  476. *
  477.  WHILE    A,GT,#0
  478.    DECA
  479.    CLR    A,X
  480. *
  481.  ENDWH
  482. *
  483. * SKIP OVER THE LEADING ZEROS IN THE BCD ARRAY
  484. *
  485.  CLRA
  486.  LDB  A,Y
  487.  WHILE    B,EQ,#0
  488.    INCA
  489.    LDB    A,Y
  490.    IF  A,EQ,(1,S)            BYTE INDEX = MAX INDEX
  491.      LDB  #-1                TERMINATE LOOP
  492. *
  493.    ENDIF
  494. *
  495.  ENDWH
  496. *
  497. * CONVERT REMAINING BCD DIGITS TO BINARY INTEGER
  498. *
  499. *
  500. *
  501.  WHILE    A,LT,(1,S),L            CONVERT BCD ARRAY
  502. *
  503. * SAVE BYTE INDEX INTO BCD ARRAY
  504. *
  505.    PSHS  A
  506. *
  507. *
  508. * MULTIPLY BINARY ACCUMULATOR BY 10
  509. *
  510.    LDB    1,S                BINARY ACCUMULATOR LENGTH
  511.    IF  B,EQ,#EXPLEN            EXPONENT CONVERSION
  512.      MUL10   X,EXPLEN
  513. *
  514.    ELSE                 SIGNIFICAND CONVERSION
  515.      MUL10  X,ACCLEN
  516. *
  517.    ENDIF
  518. *
  519. * ADD IN NEXT BCD DIGIT TO BINARY ACCUMULATOR
  520. *
  521.  LDA  0,S                BCD BYTE INDEX
  522.  LDA  A,Y                GET NEXT BCD DIGIT
  523.  ANDA  #$0F                   MASK OFF UPPER NIBBLE
  524.  LDB  1,S                   BIN. ACC. LENGTH
  525.  DECB                    OFFSET TO LSBYTE OF BIN ACC
  526.  ADDA  B,X
  527.  STA  B,X
  528. *
  529. * PROPAGATE CARRY TO HIGHER ORDER BYTES
  530. *
  531.  ANDA  #00                   CLEAR A, SAVE CCR
  532.  ROLA                       SAVE CARRY
  533.  DECB
  534.  WHILE    B,GE,#0                PROPAGATE CARRY
  535.    IFTST  A,NE,#0
  536.      ADDA  B,X                   ADD IN CARRY
  537.      STA  B,X
  538.      ANDA  #00                  CLEAR A, SAVE CCR
  539.      ROLA                  SAVE CARRY
  540.      DECB
  541. *
  542.    ELSE
  543.      LDB  #-1                  TERMINATE LOOP
  544. *
  545.    ENDIF
  546. *
  547.  ENDWH
  548. *
  549. * INCREMENT BYTE INDEX
  550. *
  551.  PULS  A
  552.  INCA
  553. *
  554.  ENDWH                     CONVERT BCD ARRAY
  555. *
  556. *
  557. RET PULS   X,Y,A,B,PC            RESTORE AND RETURN
  558. *
  559. *
  560.